#ifndef PARSING_H
#   define PARSING_H

#include <stdio.h>
#include <stdlib.h>

#include "carte_zone.h"
#include "etat_bataille.h"
#include "etat_partie.h"
#include "def_etat_exploration.h"


/**
 * \file parsing.h
 * module destine a contenir les fonctions aidant au parsing
 */





/**
 * \fn void charger_carte_zone(struct carte_zone* carte, struct etat_bataille* bataille,
                               const unsigned int num_region, const unsigned int num_zone,
                               const struct base_donnees* donnees, struct etat_partie* partie)
 * \brief Remplit une carte_zone a partir du fichier cartes.txt
 *
 * \param[out] carte Un pointeur sur la carte a remplir
 * \param[in,out] bataille L'adresse de l'etat de la bataille qui se deroulera sur la carte a charger
 * \param[in] num_region id de la region dans laquelle se trouve la carte a charger
 * \param[in] num_zone id de la zone a charger dans la region donnee
 * \param[in] donnees L'adresse d'une base_donnees correctement remplie
 * \param[in,out] partie L'adresse de l'etat de la partie
 *
 * REMARQUE : il faudra ensuite modifier cette fonction pour qu'elle prenne
 *            un argument de plus afin de savoir si le joueur a deja visite
 *            la zone ou non (une zone est dite visitee si et seulement si
 *            le joueur y a deja remporte la victoire )
 */
void charger_carte_zone(struct carte_zone* carte, struct etat_bataille* bataille,
                        const unsigned int num_region, const unsigned int num_zone,
                        const struct base_donnees* donnees, struct etat_partie* partie);



/**
 * \fn void lire_fichier_ennemis(struct base_donnees* donnees)
 * \brief Lit le fichier ennemis.txt et met le profil de tous les ennemis
 *        dans une structure base_donnee
 *
 * \param[in,out] donnees Un pointeur vers la base_donnee a remplir
 *
 * Note : cette fonction s'occupe egalement d'initialiser le tableau de
 * descriptions d'ennemis que contient donnees
 */
void lire_fichier_ennemis(struct base_donnees* donnees);



/**
 * \fn void lire_fichier_objets(struct base_donnees* donnees)
 * \brief Lit le fichier objets.txt et met la description de tous les
 *        objets dans une structure base_donnee
 *
 * \param[in,out] donnees Un pointeur vers la base_donnee a remplir
 *
 * Note : cette fonction s'occupe egalement d'initialiser le tableau de
 * descriptions d'objets que contient donnees
 */
void lire_fichier_objets(struct base_donnees* donnees);



/**
 * \fn void lire_fichier_projectiles(struct base_donnees* donnees)
 * \brief Lit le fichier projectiles.txt et met la description de tous les
 *        projectiles dans une structure base_donnee
 *
 * \param[in,out] donnees Un pointeur vers la base_donnee a remplir
 *
 * Note : cette fonction s'occupe egalement d'initialiser le tableau de
 * descriptions de projectiles que contient donnees
 */
void lire_fichier_projectiles(struct base_donnees* donnees);


/**
 * \fn void lire_fichier_niveaux(struct base_donnees* donnees);
 * \brief Lit le fichier niveaux.txt contenant les paliers d'experience
 *
 * \param[in,out] donnees Un pointeur vers la base_donnees a remplir
 */
void lire_fichier_niveaux(struct base_donnees* donnees);



/**
 * \fn void lire_fichier_partie(FILE* fichier, struct etat_partie* partie)
 * \brief Remplit un etat_partie avec les donnees contenues
 *        dans un fichier de sauvegarde
 *
 * \param[in] fichier Un pointeur vers le fichier de sauvegarde a utiliser
 * \param[in,out] partie Un etat_partie correctement initialise
 */
void lire_fichier_partie(FILE* fichier, struct etat_partie* partie);



/**
 * \fn void lire_fichier_dependances(struct base_donnees* donnees)
 * \brief Lit le fichier dependances.txt et enregistre
 *        les donnees qui s'y trouvent dans une base_donnees
 *
 * \param[out] donnees L'adresse d'une base_donnees correctement initialisee
 */
void lire_fichier_dependances(struct base_donnees* donnees);



/**
 * \fn void lire_fichier_pour_exploration(struct etat_exploration* exploration,
                                          const unsigned int id_region,
                                          const struct base_donnees* donnees)
 * \brief Lit le fichier cartes.txt dans le but de
 *        participer a l'initialisation d'un etat_exploration
 *
 * \param[out] exploration L'adresse de l'etat_exploration concerne
 * \param[in] id_region L'id de la region concernee par l'exploration
 * \param[in] donnees L'adresse d'une base de donnees correctement remplie
 */
void lire_fichier_pour_exploration(struct etat_exploration* exploration,
                                   const unsigned int id_region,
                                   const struct base_donnees* donnees);



/**
 * \fn void lire_fichier_magasin(struct base_donnees* donnees)
 * \brief Lit le fichier magasin.txt afin de savoir
 *        ce que le joueur peut acheter
 *
 * \param[out] donnees L'adresse de la base_donnees qui va recevoir les donnees
 */
void lire_fichier_magasin(struct base_donnees* donnees);



/**
 * \fn void lire_fichier_quetes(struct base_donnees* donnees)
 * \brief Lit le fichier quetes.txt afin d'enregistrer les quetes dans
 *        une structure base_donnees
 *
 * \param[out] donnees L'adresse d'une base de donnees correctement initialisee
 */
void lire_fichier_quetes(struct base_donnees* donnees);



/**
 * \fn void lire_fichier_cartes(struct base_donnees* donnees)
 * \brief Lit le fichier cartes.txt afin de dresser la liste des regions du jeu
 *
 * \param[out] donnees L'adresse d'une base de donnees correctement initialisee
 */
void lire_fichier_cartes(struct base_donnees* donnees);



/**
 * \fn FILE* creer_fichier_sauvegarde(const char* nom_fichier)
 * \brief Ouvre un fichier en mode binaire pour la sauvegarde.
 *        S'il existait deja, son contenu est efface.
 *
 * \param[in] nom_fichier Le nom qu'aura le fichier
 * \return Un pointeur vers le fichier ouvert
 *
 * \warning Dans cette fonction, le chemin vers les sauvegardes sera
 *          ajoute automatiquement. Le nom de fichier ne doit
 *          donc pas etre un chemin.
 */
FILE* creer_fichier_sauvegarde(const char* nom_fichier);



/**
 * \fn void remplir_fichier_sauvegarde(const struct etat_partie* partie, FILE* fichier)
 * \brief Ecris les donnees relative a la partie dans un fichier de sauvegarde
 *
 * \param[in] partie L'adresse de l'etat de la partie
 * \param[in,out] fichier Un pointeur vers le fichier dans lequel on va ecrire
 *
 * \warning Cette fonction ne se charge pas de fermer le fichier !
 */
void remplir_fichier_sauvegarde(const struct etat_partie* partie, FILE* fichier);



/**
 * \fn void fermer_sauvegarde(FILE* fichier)
 * \brief Ferme un fichier de sauvegarde
 *
 * \param[in] fichier Un pointeur vers le fichier a fermer
 *
 * Note : contrairement a fermer_fichier, cette fonction ne fait pas de printf.
 */
void fermer_sauvegarde(FILE* fichier);



/**
 * \fn FILE* ouvrir_fichier_sauvegarde(const char* nom_partie)
 * \brief Ouvre un fichier de sauvegarde en mode binaire pour le chargement
 *
 * \param[in] nom_partie Le nom de la partie (et donc du fichier)
 * \return Un pointeur vers le fichier ouvert
 *
 * \warning Dans cette fonction, le chemin vers les sauvegardes sera
 *          ajoute automatiquement. Le nom de partie ne doit
 *          donc pas etre un chemin.
 */
FILE* ouvrir_fichier_sauvegarde(const char* nom_partie);



/**
 * \fn void charger_partie(struct etat_partie* partie, const char* nom_partie,
                           const char nouvelle_partie)
 * \brief Charge la partie dont le nom est passe en
 *        parametre ou commence une nouvelle partie
 *
 * \param[out] partie L'adresse de la partie a remplir
 * \param[in] nom_partie Le nom de la partie a charger ou a commencer
 * \param[in] nouvelle_partie VRAI si il faut commencer une nouvelle partie,\n
 *                            FAUX s'il faut charger une partie sauvegardee
 */
void charger_partie(struct etat_partie* partie, const char* nom_partie,
                    const char nouvelle_partie);



#endif /* BATAILLE_H */
